package org.gap.service;

import java.util.List;
import java.util.Set;

import org.gap.dao.EtablissementsBancairesDAO;
import org.gap.dao.GuichetsDAO;
import org.gap.dao.PaysDAO;

import org.gap.domain.EtablissementsBancaires;
import org.gap.domain.Guichets;
import org.gap.domain.Pays;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Service;

import org.springframework.transaction.annotation.Transactional;

/**
 * Spring service that handles CRUD requests for EtablissementsBancaires entities
 * 
 */

@Service("EtablissementsBancairesService")
@Transactional
public class EtablissementsBancairesServiceImpl implements
		EtablissementsBancairesService {

	/**
	 * DAO injected by Spring that manages EtablissementsBancaires entities
	 * 
	 */
	@Autowired
	private EtablissementsBancairesDAO etablissementsBancairesDAO;

	/**
	 * DAO injected by Spring that manages Guichets entities
	 * 
	 */
	@Autowired
	private GuichetsDAO guichetsDAO;

	/**
	 * DAO injected by Spring that manages Pays entities
	 * 
	 */
	@Autowired
	private PaysDAO paysDAO;

	/**
	 * Instantiates a new EtablissementsBancairesServiceImpl.
	 *
	 */
	public EtablissementsBancairesServiceImpl() {
	}

	/**
	 * Save an existing Guichets entity
	 * 
	 */
	@Transactional
	public EtablissementsBancaires saveEtablissementsBancairesGuichetses(String etbPays, Integer etbEtablissement, Guichets related_guichetses) {
		EtablissementsBancaires etablissementsbancaires = etablissementsBancairesDAO.findEtablissementsBancairesByPrimaryKey(etbPays, etbEtablissement, -1, -1);
		Guichets existingguichetses = guichetsDAO.findGuichetsByPrimaryKey(related_guichetses.getGuiEtablissement(), related_guichetses.getGuiGuichet(), related_guichetses.getGuiPays());

		// copy into the existing record to preserve existing relationships
		if (existingguichetses != null) {
			existingguichetses.setGuiEtablissement(related_guichetses.getGuiEtablissement());
			existingguichetses.setGuiGuichet(related_guichetses.getGuiGuichet());
			existingguichetses.setGuiPays(related_guichetses.getGuiPays());
			existingguichetses.setGuiDomiciliation(related_guichetses.getGuiDomiciliation());
			existingguichetses.setGuiAdressePrelevement(related_guichetses.getGuiAdressePrelevement());
			existingguichetses.setGuiContactPrelevement(related_guichetses.getGuiContactPrelevement());
			existingguichetses.setGuiChronoTrace(related_guichetses.getGuiChronoTrace());
			existingguichetses.setGuiNomGuichet(related_guichetses.getGuiNomGuichet());
			existingguichetses.setGuiCodeNouvEtablissement(related_guichetses.getGuiCodeNouvEtablissement());
			existingguichetses.setGuiNouvGuichet(related_guichetses.getGuiNouvGuichet());
			existingguichetses.setGuiLocaliteCompensation1(related_guichetses.getGuiLocaliteCompensation1());
			existingguichetses.setGuiLocaliteCompensation2(related_guichetses.getGuiLocaliteCompensation2());
			existingguichetses.setGuiDebutValidite(related_guichetses.getGuiDebutValidite());
			existingguichetses.setGuiFinValidite(related_guichetses.getGuiFinValidite());
			existingguichetses.setGuiDisparition(related_guichetses.getGuiDisparition());
			existingguichetses.setGuiNatureGuichet(related_guichetses.getGuiNatureGuichet());
			existingguichetses.setGuiCodeSituation(related_guichetses.getGuiCodeSituation());
			existingguichetses.setGuiTiers(related_guichetses.getGuiTiers());
			related_guichetses = existingguichetses;
		}

		related_guichetses.setEtablissementsBancaires(etablissementsbancaires);
		etablissementsbancaires.getGuichetses().add(related_guichetses);
		related_guichetses = guichetsDAO.store(related_guichetses);
		guichetsDAO.flush();

		etablissementsbancaires = etablissementsBancairesDAO.store(etablissementsbancaires);
		etablissementsBancairesDAO.flush();

		return etablissementsbancaires;
	}

	/**
	 * Save an existing EtablissementsBancaires entity
	 * 
	 */
	@Transactional
	public void saveEtablissementsBancaires(EtablissementsBancaires etablissementsbancaires) {
		EtablissementsBancaires existingEtablissementsBancaires = etablissementsBancairesDAO.findEtablissementsBancairesByPrimaryKey(etablissementsbancaires.getEtbPays(), etablissementsbancaires.getEtbEtablissement());

		if (existingEtablissementsBancaires != null) {
			if (existingEtablissementsBancaires != etablissementsbancaires) {
				existingEtablissementsBancaires.setEtbPays(etablissementsbancaires.getEtbPays());
				existingEtablissementsBancaires.setEtbEtablissement(etablissementsbancaires.getEtbEtablissement());
				existingEtablissementsBancaires.setEtbDescription(etablissementsbancaires.getEtbDescription());
				existingEtablissementsBancaires.setEtbCodeSituation(etablissementsbancaires.getEtbCodeSituation());
				existingEtablissementsBancaires.setEtbDateDebutValidite(etablissementsbancaires.getEtbDateDebutValidite());
				existingEtablissementsBancaires.setEtbDateFinValidite(etablissementsbancaires.getEtbDateFinValidite());
				existingEtablissementsBancaires.setEtbDateDisparition(etablissementsbancaires.getEtbDateDisparition());
				existingEtablissementsBancaires.setEtbCodeEtablissNouveau(etablissementsbancaires.getEtbCodeEtablissNouveau());
				existingEtablissementsBancaires.setEtbOptionIdInvariant(etablissementsbancaires.getEtbOptionIdInvariant());
				existingEtablissementsBancaires.setEtbDateEffetIdInvariant(etablissementsbancaires.getEtbDateEffetIdInvariant());
			}
			etablissementsbancaires = etablissementsBancairesDAO.store(existingEtablissementsBancaires);
		} else {
			etablissementsbancaires = etablissementsBancairesDAO.store(etablissementsbancaires);
		}
		etablissementsBancairesDAO.flush();
	}

	/**
	 * Delete an existing Pays entity
	 * 
	 */
	@Transactional
	public EtablissementsBancaires deleteEtablissementsBancairesPays(String etablissementsbancaires_etbPays, Integer etablissementsbancaires_etbEtablissement, String related_pays_pppPays) {
		EtablissementsBancaires etablissementsbancaires = etablissementsBancairesDAO.findEtablissementsBancairesByPrimaryKey(etablissementsbancaires_etbPays, etablissementsbancaires_etbEtablissement, -1, -1);
		Pays related_pays = paysDAO.findPaysByPrimaryKey(related_pays_pppPays, -1, -1);

		etablissementsbancaires.setPays(null);
		related_pays.getEtablissementsBancaireses().remove(etablissementsbancaires);
		etablissementsbancaires = etablissementsBancairesDAO.store(etablissementsbancaires);
		etablissementsBancairesDAO.flush();

		related_pays = paysDAO.store(related_pays);
		paysDAO.flush();

		paysDAO.remove(related_pays);
		paysDAO.flush();

		return etablissementsbancaires;
	}

	/**
	 * Delete an existing Guichets entity
	 * 
	 */
	@Transactional
	public EtablissementsBancaires deleteEtablissementsBancairesGuichetses(String etablissementsbancaires_etbPays, Integer etablissementsbancaires_etbEtablissement, Integer related_guichetses_guiEtablissement, Integer related_guichetses_guiGuichet, String related_guichetses_guiPays) {
		Guichets related_guichetses = guichetsDAO.findGuichetsByPrimaryKey(related_guichetses_guiEtablissement, related_guichetses_guiGuichet, related_guichetses_guiPays, -1, -1);

		EtablissementsBancaires etablissementsbancaires = etablissementsBancairesDAO.findEtablissementsBancairesByPrimaryKey(etablissementsbancaires_etbPays, etablissementsbancaires_etbEtablissement, -1, -1);

		related_guichetses.setEtablissementsBancaires(null);
		etablissementsbancaires.getGuichetses().remove(related_guichetses);

		guichetsDAO.remove(related_guichetses);
		guichetsDAO.flush();

		return etablissementsbancaires;
	}

	/**
	 * Load an existing EtablissementsBancaires entity
	 * 
	 */
	@Transactional
	public Set<EtablissementsBancaires> loadEtablissementsBancairess() {
		return etablissementsBancairesDAO.findAllEtablissementsBancairess();
	}

	/**
	 */
	@Transactional
	public EtablissementsBancaires findEtablissementsBancairesByPrimaryKey(String etbPays, Integer etbEtablissement) {
		return etablissementsBancairesDAO.findEtablissementsBancairesByPrimaryKey(etbPays, etbEtablissement);
	}

	/**
	 * Return a count of all EtablissementsBancaires entity
	 * 
	 */
	@Transactional
	public Integer countEtablissementsBancairess() {
		return ((Long) etablissementsBancairesDAO.createQuerySingleResult("select count(*) from EtablissementsBancaires o").getSingleResult()).intValue();
	}

	/**
	 * Delete an existing EtablissementsBancaires entity
	 * 
	 */
	@Transactional
	public void deleteEtablissementsBancaires(EtablissementsBancaires etablissementsbancaires) {
		etablissementsBancairesDAO.remove(etablissementsbancaires);
		etablissementsBancairesDAO.flush();
	}

	/**
	 * Return all EtablissementsBancaires entity
	 * 
	 */
	@Transactional
	public List<EtablissementsBancaires> findAllEtablissementsBancairess(Integer startResult, Integer maxRows) {
		return new java.util.ArrayList<EtablissementsBancaires>(etablissementsBancairesDAO.findAllEtablissementsBancairess(startResult, maxRows));
	}

	/**
	 * Save an existing Pays entity
	 * 
	 */
	@Transactional
	public EtablissementsBancaires saveEtablissementsBancairesPays(String etbPays, Integer etbEtablissement, Pays related_pays) {
		EtablissementsBancaires etablissementsbancaires = etablissementsBancairesDAO.findEtablissementsBancairesByPrimaryKey(etbPays, etbEtablissement, -1, -1);
		Pays existingpays = paysDAO.findPaysByPrimaryKey(related_pays.getPppPays());

		// copy into the existing record to preserve existing relationships
		if (existingpays != null) {
			existingpays.setPppPays(related_pays.getPppPays());
			existingpays.setPppLibelle(related_pays.getPppLibelle());
			existingpays.setPppMasqueCodePostal(related_pays.getPppMasqueCodePostal());
			existingpays.setPppMasqueTelephone(related_pays.getPppMasqueTelephone());
			existingpays.setPppPrefixeInternational(related_pays.getPppPrefixeInternational());
			existingpays.setPppLibelleRecherche(related_pays.getPppLibelleRecherche());
			existingpays.setPppCpModifiable(related_pays.getPppCpModifiable());
			existingpays.setPppNInsee(related_pays.getPppNInsee());
			existingpays.setPppEtiquetteRib(related_pays.getPppEtiquetteRib());
			existingpays.setPppMasquePortable(related_pays.getPppMasquePortable());
			existingpays.setPppMasqueEtablissement(related_pays.getPppMasqueEtablissement());
			existingpays.setPppMasqueGuichet(related_pays.getPppMasqueGuichet());
			existingpays.setPppMasqueCompte(related_pays.getPppMasqueCompte());
			existingpays.setPppMasqueCle(related_pays.getPppMasqueCle());
			existingpays.setPppOrdreDsIban(related_pays.getPppOrdreDsIban());
			existingpays.setPppCe(related_pays.getPppCe());
			related_pays = existingpays;
		}

		etablissementsbancaires.setPays(related_pays);
		related_pays.getEtablissementsBancaireses().add(etablissementsbancaires);
		etablissementsbancaires = etablissementsBancairesDAO.store(etablissementsbancaires);
		etablissementsBancairesDAO.flush();

		related_pays = paysDAO.store(related_pays);
		paysDAO.flush();

		return etablissementsbancaires;
	}
}
